package Colletion_Study.Set_01;

import java.util.TreeSet;

public class TreeSetDemo4 {
    /*
        需求：创建5个学生对象
        属性：（姓名，年龄，语文成绩，数学成绩，英语成绩）
        按照总分从高到低输出到控制台
        如果总分一样，按照语文成绩排序
        如果语文成绩一样，按照数学成绩排序
        如果数学成绩一样，按照英语成绩排序
        如果英语成绩一样，按照年龄排序
        如果年龄一样，按照姓名的字母排序
        如果都一样，则认为是同一个学生，不存
     */
    public static void main(String[] args) {
        PrimaryStudent ps = new PrimaryStudent("huihui", 12, 89, 78, 81);
        PrimaryStudent ps1 = new PrimaryStudent("fangfang", 11, 84, 91, 76);
        PrimaryStudent ps2 = new PrimaryStudent("dingbiyu", 13, 92, 87, 85);
        PrimaryStudent ps3 = new PrimaryStudent("guanpeixing", 12, 91, 83, 94);
        PrimaryStudent ps4 = new PrimaryStudent("zhangqiaolian", 10, 88, 87, 83);
        PrimaryStudent ps5 = new PrimaryStudent("chengjiayi", 11, 86, 82, 83);

        TreeSet<PrimaryStudent> ts = new TreeSet<>();

        ts.add(ps);
        ts.add(ps1);
        ts.add(ps2);
        ts.add(ps3);
        ts.add(ps4);
        ts.add(ps5);

        ts.forEach(System.out::println);

    }
}

class PrimaryStudent implements Comparable<PrimaryStudent> {
    private String name;
    private int age;
    private int chineseScore;
    private int mathScore;
    private int englishScore;
    private int allScore;

    public PrimaryStudent() {
    }

    public PrimaryStudent(String name, int age, int chineseScore, int mathScore, int englishScore) {
        this.name = name;
        this.age = age;
        this.chineseScore = chineseScore;
        this.mathScore = mathScore;
        this.englishScore = englishScore;
    }

    /**
     * 获取
     *
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     *
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     *
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     *
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    /**
     * 获取
     *
     * @return chineseScore
     */
    public int getChineseScore() {
        return chineseScore;
    }

    /**
     * 设置
     *
     * @param chineseScore
     */
    public void setChineseScore(int chineseScore) {
        this.chineseScore = chineseScore;
    }

    /**
     * 获取
     *
     * @return mathScore
     */
    public int getMathScore() {
        return mathScore;
    }

    /**
     * 设置
     *
     * @param mathScore
     */
    public void setMathScore(int mathScore) {
        this.mathScore = mathScore;
    }

    /**
     * 获取
     *
     * @return englishScore
     */
    public int getEnglishScore() {
        return englishScore;
    }

    /**
     * 设置
     *
     * @param englishScore
     */
    public void setEnglishScore(int englishScore) {
        this.englishScore = englishScore;
    }

    /**
     * 获取
     *
     * @return allScore
     */
    public int getAllScore() {
        return chineseScore + mathScore + englishScore;
    }

    @Override
    public String toString() {
        return name + ", " + age + ", " + ", " + chineseScore + ", " + mathScore + ", " + englishScore + ", " + this.getAllScore();
    }

    @Override
    public int compareTo(PrimaryStudent o) {
        /*
        需求：创建5个学生对象
        属性：（姓名，年龄，语文成绩，数学成绩，英语成绩）
        按照总分从高到低输出到控制台
        如果总分一样，按照语文成绩排序
        如果语文成绩一样，按照数学成绩排序
        如果数学成绩一样，按照英语成绩排序
        如果英语成绩一样，按照年龄排序
        如果年龄一样，按照姓名的字母排序
        如果都一样，则认为是同一个学生，不存
     */
        // 比较总分成绩
        int i = o.getAllScore() - this.getAllScore();
        // 如果总分一样，按照语文成绩排序
        i = i == 0 ? o.getChineseScore() - this.getChineseScore() : i;
        // 如果语文成绩一样，按照数学成绩排序
        i = i == 0 ? o.getMathScore() - this.getMathScore() : i;
        // 如果数学成绩一样，按照英语成绩排序（可以省略）
//        i = i == 0 ? this.getEnglishScore() - o.getEnglishScore() : i;
        // 如果英语成绩一样，按照年龄排序
        i = i == 0 ? o.getAge() - this.getAge() : i;
        // 如果年龄一样，按照姓名的字母排序
        i = i == 0 ? o.getName().compareTo(this.getName()) : i;
        return i;
    }
}
